#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<unistd.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>

int main()
{
    int sock=socket(AF_INET,SOCK_DGRAM,0);
    if(sock < 0)
    {
        printf("socket() failed!\n");
        return 1;
    }
    struct sockaddr_in serverAddr;
    memset(serverAddr,0,sizeof(serverAddr));
    serverAddr.sin_family=AF_INET;
    serverAddr.sin_port=htons(8080);
    serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
    if(bind(sock,(struct sockaddr*)&serverAddr,sizeof(serverAddr)) < 0)
    {
        //绑定失败了就把这个sock给关了吧
        printf("bind() failed!\n");
        close(sock);
        return 1;
    }
    char recvData[1024];
    struct sockaddr_in clientAddr;
    socketlen_t len=sizeof(clientAddr);
    while(1)
    {
        int retRecv=recvfrom(sock,(struct sockaddr*)&clientAddr,sizeof(clientAddr),0,(struct sockaddr*)&clientAddr,&len);
        if(retRecv < 0)
        {
            printf("recvfrom() failed!\n");
            continue;
        }
        printf("Recieved from client: [%s:%d]:%s\n",inet_ntoa(clientAddr.sin_addr.s_addr),ntohs(clientAddr.sin_port),recvData);
        char sendData[]="hello client I am server!\n";
        int retSend=sendto(sock,sendData,sizeof(sendData),0,(struct sockaddr*)&clientAddr,sizeof(clientAddr));
        if(retSend < 0)
        {
            printf("sendto() failed!\n");
            continue;
        }
    }
    close(sock); 
    return 0;
}
// int main()
// {
//     //创建sock对象
//     int sock=socket(AF_INET,SOCK_DGRAM,0);
//     if(sock < 0)
//     {
//         printf("socket() failed!\n");
//         return 1;
//     }
//     //准备服务端地址
//     struct sockaddr_in serverAddr;
//     memset(&serverAddr,0,sizeof(serverAddr));
//     serverAddr.sin_family=AF_INET;
//     serverAddr.sin_port=htons(8080);
//     serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
//     //绑定sock到服务端地址
//     if(bind(sock,(struct sockaddr*)&serverAddr,sizeof(serverAddr)) < 0)
//     {
//         printf("bind() failed!\n");
//         close(sock);
//         return 1;
//     }
//     //接受客户端发来的信息
//     char recvData[1024];
//     struct sockaddr_in clientAddr;
//     socketlen_t len=sizeof(clientAddr);
//     while(1)
//     {
//         int retRecv=recvfrom(sock,recvData,sizeof(recvData),0,(struct sockaddr*)&clientAddr,&len);
//         if(retRecv < 0)
//         {
//             printf("recvfrom() failed!\n");
//             continue;
//         }
//         //输出从客户端接收到的消息
//         printf("message from client: [%s:%d]:%s\n",inet_ntoa(clientAddr.sin_addr),ntohs(clientAddr.sin_port),recvData);
//         char sendData[]="hello client I am server\n";
//         int retSend=sendto(sock,sendData,sizeof(sendData),0,(struct sockaddr*)&clientAddr,&len);
//         if(retSend < 0)
//         {
//             printf("sendto() failed!\n");
//             continue;
//         }
//     }
//     close(sock);
//     return 0;
// }
// int main(void)
// {
//     //创建socket对象
//     int sock=socket(AF_INET,SOCK_DGRAM,0);
//     if(sock < 0)
//     {
//         printf("socket() failed!\n");
//         return 1;
//     }
//     int sock=socket(AF_INET,SOCK_DGRAM,0);
//     if(sock < 0)
//     {
//         printf("socket() failed!\n");
//         return 1;
//     }
//     int sock = socket(AF_INET, SOCK_DGRAM, 0);
//     if (sock < 0)
//     {
//         printf("socket() failed!\n");
//         return 1;
//     }

//     //准备服务端地址
//     struct sockaddr_in serverAddr;
//     memset(&serverAddr,0,sizeof(serverAddr));
//     serverAddr.sin_family=AF_INET;
//     serverAddr.sin_port=htons(8080);
//     serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
//     //这里准备好服务端的地址
//     struct sockaddr_in serverAddr;
//     memset(&serverAddr, 0, sizeof(serverAddr));
//     serverAddr.sin_family = AF_INET;
//     serverAddr.sin_port = htons(8000); //绑定8000端口
//     serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); //任意IP地址

//     //绑定socket对象到服务端地址
//     if(bind(sock,(struct sockaddr*)&serverAddr,sizeof(serverAddr)) < 0)
//     {
//         printf("bind() failed!\n");
//         close(sock);
//         return 1;
//     }
//     if (bind(sock, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0)
//     {
//         printf("bind() failed!\n");
//         close(sock);
//         return 1;
//     }
//     char recvData[1024];
//     struct sockaddr_in* clientAddr;
//     socklen_t len=sizeof(clientAddr);
//     while(1)
//     {
//         int retRecv=recvfrom(sock,recvData,sizeof(recvData),0,(struct sockaddr*)&clientAddr,&len);
//         if(retRecv < 0)
//         {
//             printf("recvfrom failed!\n");
//             continue;
//         }
//         //将IP地址由网络转主机，再转变成字符串
//         printf("Recived data from client:(%s:%d):%s",inet_ntoa(clientAddr->sin_addr),ntohs(clientAddr->sin_port),recvData);
//         //回复客户端
//         char sendData[]="hello client I am server\n";
//         int retSend=sendto(sock,sendData,sizeof(sendData),0,(struct sockaddr*)&clientAddr,sizeof(clientAddr));
//         if(retSend < 0)
//         {
//             printf("sendto() failed!\n");
//             continue;
//         }
//     }
//     close(sock);
//     return 0;
//     //接收并处理客户端发送的数据
//     char recvData[1024];
//     struct sockaddr_in clientAddr;
//     socklen_t len = sizeof(clientAddr);
//     while (1)
//     {
//         int retRecv = recvfrom(sock, recvData, sizeof(recvData), 0, (struct sockaddr*)&clientAddr, &len);
//         if (retRecv < 0)
//         {
//             printf("recvfrom() failed!\n");
//             continue;
//         }

//         //输出客户端发来的数据
//         printf("Received data from client (%s:%d): %s\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port), recvData);

//         //回复客户端
//         char sendData[] = "Hello, client! I am server!";
//         int retSend = sendto(sock, sendData, strlen(sendData), 0, (struct sockaddr*)&clientAddr, sizeof(clientAddr));
//         if (retSend < 0)
//         {
//             printf("sendto() failed!\n");
//             continue;
//         }
//     }

//     //关闭socket对象
//     close(sock);

//     return 0;
// }
// int main()
// {
//     int sock=socket(AF_INET,SOCK_DGRAM,0);
//     if(sock < 0)
//     {
//         printf("socket() failed!\n");
//         return 1;
//     }
//     //准备服务器的地址
//     struct sockaddr_in serverAddr;
//     memset(&serverAddr,0,sizeof(serverAddr));
//     //这里必然要涉及到主机转网络
//     serverAddr.sin_family=AF_INET;
//     //端口号是一个短整型
//     serverAddr.sin_port=htons(8000);
//     //任意的IP地址，他是一个长整型
//     serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
//     //绑定socket到服务端地址
//     if(bind(sock,(struct sockAddr*)&serverAddr,sizeof(serverAddr)) < 0)
//     {
//         printf("bind() failed!\n");
//         close(sock);
//         return 1;
//     }
//     //接受并处理客户端发送的数据
//     char recvData[1024];
//     struct sockaddr_in clientAddr;
//     socklen_t len=sizeof(clientAddr);
//     while(1)
//     {
//         int retRecv=recvfrom(sock,recvData,sizeof(recvData),0,(struct sockaddr*)&clientAddr,&len);
//         if(retRecv < 0)
//         {
//             printf("recvfrom() failed!\n");
//             continue;
//         }
//         printf("Received data from client (%s:%d):%s\n",inetntoa(clientAddr.sin_addr),ntohs(clientAddr.sin_port),recvData);
//         char sendData[]="hello client I am server\n";
//         int retSend=sendto(sock,sendData,strlen(sendData),0,(struct sockaddr*)&clientAddr,sizeof(clientAddr));
//     }
//     return 0;
// }